📝 Резюме · 🧾 Транскрипт (формат) · 📄 Оригинал (569 B)
https://t.me/Python_libr/3554

func.defaults — значения по умолчанию в Python

Источник: https://t.me/Python_libr/3554

Краткое содержание

Короткая обучающая заметка о поведении атрибута func.__defaults__ в Python. Значения аргументов по умолчанию вычисляются один раз при определении функции и сохраняются в кортеже func.__defaults__. Это вызывает неожиданное поведение при использовании изменяемых объектов (например, списков или словарей) в качестве значений по умолчанию — все вызовы функции разделяют один и тот же объект.

def foo(x, lst=[]):
    lst.append(x)
    return lst

print(foo(1))  # [1]
print(foo(2))  # [1, 2]  — список не сбрасывается!
print(foo.__defaults__)  # ([1, 2],)

Однако это же свойство можно использовать намеренно — например, для передачи значений в лямбда-функции через раннее связывание:

funcs = [lambda x, n=n: x + n for n in range(5)]
print(funcs[3](10))  # 13 — n зафиксировано через __defaults__

Значимость

Важная тонкость Python для понимания области видимости и жизненного цикла объектов. Тема актуальна при написании функций с изменяемыми аргументами по умолчанию и при создании замыканий в циклах.

🧾 Транскрипт (формат)

📌 func.__defaults__

Источник: https://t.me/Python_libr/3554

📌 func.__defaults__

Значения по умолчанию генерируются только один раз и сохраняются в переменной func.__defaults__, что и приводит к странному поведению.

Но это может сыграть и нам на руку, ведь таким образом можно передать значения в лямбду.

#урок